package br.uvv.sao.managedBean;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;

import org.primefaces.event.UnselectEvent;

import br.uvv.sao.domain.Alternativa;
import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.Disciplina;
import br.uvv.sao.domain.Professor;
import br.uvv.sao.domain.Prova;
import br.uvv.sao.domain.ProvaRealizada;
import br.uvv.sao.domain.Questao;
import br.uvv.sao.rn.DisciplinaRN;
import br.uvv.sao.rn.ProfessorRN;
import br.uvv.sao.rn.RealizarProvaRN;
import br.uvv.sao.util.DAOException;
import br.uvv.sao.util.RNException;
import br.uvv.sao.util.Util;

public class RealizarProvaBean implements Serializable {
	private static final long serialVersionUID = -9214131836814499053L;
	
	private RealizarProvaRN service;
	
	/**
	 * Listas
	 */
	private List<Prova> provaList;
	private List<Questao> questaoList;
	private List<Disciplina> disciplinaList;
	private List<Professor> professorList;
	List<ProvaRealizada> provaRealizadaList;
	
	
	private Aluno alunoInstance;
	private Prova provaInstance;
	private Alternativa alternativaMarcada;
	private String ano;
	private String mes;
	private String dia;
	private String horas;
	private String minutos;
	private Date buscaAno;
	private String buscaSemestre;
	private Long buscaDisciplina;
	private Long buscaProfessor;
	
	public String goShow(){
		init();
		filtrarProvas();
		return "realizarProva";
	}
	
	public void filtrarProvas(){
		try {
			provaList = service.getListaProvas(alunoInstance, buscaAno, buscaSemestre, buscaDisciplina, buscaProfessor);
		} catch (DAOException e) {
			e.printStackTrace();
		}
	}
	
	public String goHome(){
		return "goHome";
	}
	
	public void rowUnSelectProvas(UnselectEvent event){
		provaInstance = new Prova();
	}
	
	public Boolean getPodeVerResultado(){
		if(provaInstanceNaoEhNula(provaInstance) && provaInstance.getDataHoraFim().compareTo(new Date()) >= 0){
			return true;
		}
		return false;
	}
	
	private boolean provaInstanceNaoEhNula(Prova provaInstance2) {
		try {
			if(provaInstance2.getId() > 0){
				return true;
			}
		} catch (Exception e) {
		}
		return false;
	}

	public Boolean getPodeRealizarProva(){
		if(provaInstanceNaoEhNula(provaInstance) && provaInstance.getDataHoraInicio().compareTo(new Date()) < 0 && provaInstance.getDataHoraFim().compareTo(new Date()) < 0){
			return true;
		}
		return false;
	}
	
	public String realizarProva(){
		try {
			questaoList = service.getListaQuestao(provaInstance);
			provaRealizadaList = service.listarProvasRealizadas(provaInstance, alunoInstance);
		} catch (DAOException e) {
			e.printStackTrace();
		} catch (RNException e) {
			e.printStackTrace();
		}
		return "/views/realizarProva/realizarProva.xhtml";
	}
	
	public String voltarRealizarProva(){
		provaInstance = new Prova();
		provaRealizadaList = new ArrayList<ProvaRealizada>();
		questaoList = new ArrayList<Questao>();
		return "/views/realizarProva/show.xhtml";
	}
	
	public String visualizarResultado(){
		try {
			questaoList = service.getListaQuestao(provaInstance);
			provaRealizadaList = service.listarProvasRealizadas(provaInstance, alunoInstance);
		} catch (DAOException e) {
			e.printStackTrace();
		} catch (RNException e) {
			e.printStackTrace();
		}
		return "/views/realizarProva/visualizarResultado.xhtml";
	}
	
	public String voltarVisualizarResultado(){
		provaInstance = new Prova();
		provaRealizadaList = new ArrayList<ProvaRealizada>();
		questaoList = new ArrayList<Questao>();
		return "/views/realizarProva/show.xhtml";
	}
	
	public Integer getNumeroQuestoes(){
		try {
			provaRealizadaList = service.listarProvasRealizadas(provaInstance, alunoInstance);
		} catch (RNException e) {
			e.printStackTrace();
		}
		Integer valor = questaoList.size();
		return valor;
	}
	
	public Integer getNumeroQuestoesRespondidas(){
		Integer valor = provaRealizadaList.size();
		return valor;
	}
	
	public Integer getNumeroQuestoesBranco(){
		Integer valor = questaoList.size() - provaRealizadaList.size();
		return valor;
	}
	
	@PostConstruct
	public void init(){
		DisciplinaRN disciplinaRN = new DisciplinaRN();
		ProfessorRN professorRN = new ProfessorRN();
		try {
			disciplinaList = disciplinaRN.listar("", "");
		} catch (RNException e) {
			e.printStackTrace();
		}
		professorList = professorRN.listar("", "");
		service = new RealizarProvaRN();
		alunoInstance = (Aluno) Util.getUsuarioLogado();
		provaInstance = new Prova();
		provaList = new ArrayList<Prova>();
		questaoList = new ArrayList<Questao>();
		alternativaMarcada = new Alternativa();
	}
	
	public Aluno getAlunoInstance() {
		return alunoInstance;
	}
	public void setAlunoInstance(Aluno alunoInstance) {
		this.alunoInstance = alunoInstance;
	}
	public Prova getProvaInstance() {
		return provaInstance;
	}
	public void setProvaInstance(Prova provaInstance) {
		this.provaInstance = provaInstance;
	}

	public String getAno() {
		SimpleDateFormat simpleDate = new SimpleDateFormat("dd/MM/yyyy/HH/mm");
		String dataTroca = "";
		Calendar dataPrimeira = Calendar.getInstance();
		dataPrimeira.setTime(provaInstance.getDataHoraFim());
		dataTroca = simpleDate.format(dataPrimeira.getTime());
		String[] arrayResultado = dataTroca.split("/");
		this.ano = arrayResultado[2];
		return this.ano;
	}

	public void setAno(String ano) {
		this.ano = ano;
	}

	public String getMes() {
		SimpleDateFormat simpleDate = new SimpleDateFormat("dd/MM/yyyy/HH/mm");
		String dataTroca = "";
		Calendar dataPrimeira = Calendar.getInstance();
		dataPrimeira.setTime(provaInstance.getDataHoraFim());
		dataTroca = simpleDate.format(dataPrimeira.getTime());
		String[] arrayResultado = dataTroca.split("/");
		this.mes = arrayResultado[1];
		return this.mes;
	}

	public void setMes(String mes) {
		this.mes = mes;
	}

	public String getDia() {
		SimpleDateFormat simpleDate = new SimpleDateFormat("dd/MM/yyyy/HH/mm");
		String dataTroca = "";
		Calendar dataPrimeira = Calendar.getInstance();
		dataPrimeira.setTime(provaInstance.getDataHoraFim());
		dataTroca = simpleDate.format(dataPrimeira.getTime());
		String[] arrayResultado = dataTroca.split("/");
		this.dia = arrayResultado[0];
		return this.dia;
	}

	public void setDia(String dia) {
		this.dia = dia;
	}

	public String getHoras() {
		SimpleDateFormat simpleDate = new SimpleDateFormat("dd/MM/yyyy/HH/mm");
		String dataTroca = "";
		Calendar dataPrimeira = Calendar.getInstance();
		dataPrimeira.setTime(provaInstance.getDataHoraFim());
		dataTroca = simpleDate.format(dataPrimeira.getTime());
		String[] arrayResultado = dataTroca.split("/");
		this.horas = arrayResultado[3];
		return this.horas;
	}

	public void setHoras(String horas) {
		this.horas = horas;
	}

	public String getMinutos() {
		SimpleDateFormat simpleDate = new SimpleDateFormat("dd/MM/yyyy/HH/mm");
		String dataTroca = "";
		Calendar dataPrimeira = Calendar.getInstance();
		dataPrimeira.setTime(provaInstance.getDataHoraFim());
		dataTroca = simpleDate.format(dataPrimeira.getTime());
		String[] arrayResultado = dataTroca.split("/");
		this.minutos = arrayResultado[4];
		return this.minutos;
	}

	public void setMinutos(String minutos) {
		this.minutos = minutos;
	}


	public List<Prova> getProvaList() {
		return provaList;
	}


	public void setProvaList(List<Prova> provaList) {
		this.provaList = provaList;
	}

	public Date getBuscaAno() {
		return buscaAno;
	}

	public void setBuscaAno(Date buscaAno) {
		this.buscaAno = buscaAno;
	}

	public String getBuscaSemestre() {
		return buscaSemestre;
	}

	public void setBuscaSemestre(String buscaSemestre) {
		this.buscaSemestre = buscaSemestre;
	}

	public List<Disciplina> getDisciplinaList() {
		return disciplinaList;
	}

	public void setDisciplinaList(List<Disciplina> disciplinaList) {
		this.disciplinaList = disciplinaList;
	}

	public List<Professor> getProfessorList() {
		return professorList;
	}

	public void setProfessorList(List<Professor> professorList) {
		this.professorList = professorList;
	}

	public Long getBuscaDisciplina() {
		return buscaDisciplina;
	}

	public void setBuscaDisciplina(Long buscaDisciplina) {
		this.buscaDisciplina = buscaDisciplina;
	}

	public Long getBuscaProfessor() {
		return buscaProfessor;
	}

	public void setBuscaProfessor(Long buscaProfessor) {
		this.buscaProfessor = buscaProfessor;
	}

	public List<Questao> getQuestaoList() {
		return questaoList;
	}

	public void setQuestaoList(List<Questao> questaoList) {
		this.questaoList = questaoList;
	}
	public void setAlternativaMarcada(Alternativa alternativaMarcada) {
		try {
			service.marcarAlternativa(alternativaMarcada.getId(), provaInstance, alunoInstance);
			questaoList.get(questaoList.indexOf(alternativaMarcada.getQuestao())).setAlternativaEscolhida(alternativaMarcada);
		} catch (RNException e) {
			e.printStackTrace();
		}
		this.alternativaMarcada = new Alternativa();
	}public Alternativa getAlternativaMarcada() {
		return alternativaMarcada;
	}
	
}
